package com.offcn.bigdata.spark.p2;

import java.util.Random;
/*
    https://www.cnblogs.com/krcys/p/9121487.html
假如10000个数,我们要抽取十个随机数.
一万个数的样本集合数组记作S.
十个随机数的数组记作R,代表result.
先取数组S中前十个数填充进数组R.
算法的第一次迭代流程是这样的:
	从第十一个数(下标为10)开始迭代,生成一个0到10的随机整数j,如果j<10(假如J=4),我们就将数组R中的第5项(R[4])替换成S数组中的第11项(S[10]).
遍历完成生成的R数组,就是我们要求的随机数组.

抽象概念
S[N]记作:样本集合
R[K]记作:结果集合
N记作:S数组大小
J记作:每次的随机数
K记作:前K个随机数
i记作:迭代次数.
步骤
	取S集合中前K个数填入R集合
	从S[K]开始遍历
		生成随机数J,范围是0−>K+i−1.因为数组下标从0开始,所以-1.
		如果J<K,则替换R中的值->R[j]=S[i].
		遍历结束,生成结果数组R.


 */
public class PondSample {
    public static void main(String[] args) {
        int[] S = new int[10000];
        for(int i = 0; i < 10000; i++) {
            S[i] = i;
        }
        int key = 10;
        int[] R = new int[key];
        //step 1 取水塘中10000个数的前10个作为结果
        for(int i = 0; i < key; i++) {
            R[i] = S[i];
        }
        Random random = new Random();
        for(int i = key; i < S.length; i++) {
            int j = random.nextInt(i);
            if(j < key) { // 生成了一个0~10之间的随机数
               R[j] = S[i];//就讲S中的第i项赋值给R中的第j项
            }
        }
        for (int i = 0; i < R.length; i++) {
            System.out.println(R[i]);
        }
    }
}
